package baseclass.b_stackQueue;

import java.util.LinkedList;
import java.util.Queue;

/**
 *  实现一种狗猫队列的结构， 要求如下：
 *  1)用户可以调用add方法将cat类或dog类的实例放入队列中；
 *  2)用户可以调用pollAll方法， 将队列中所有的实例按照进队列的先后顺序依次弹出【主要是这个，给进入的猫狗打时间戳，才能在pollAll的时候判断谁先出】；
 *  3)用户可以调用pollDog方法， 将队列中dog类的实例按照进队列的先后顺序依次弹出；
 *  4)用户可以调用pollCat方法， 将队列中cat类的实例按照进队列的先后顺序依次弹出；
 *  5)用户可以调用isEmpty方法， 检查队列中是否还有dog或cat的实例；
 *      用户可以调用isDogEmpty方法，检查队列中是否有dog类的实例；
 *      用户可以调用isCatEmpty方法， 检查队列中是否有cat类的实例。
 * @date 2020/2/27 19:48
 */
class Pet{
    String type;
    public Pet() {
    }
    public Pet(String type) {
        this.type = type;
    }
}
class Dog extends Pet{
    public Dog(){
        super("Dog");
    }

}
class Cat extends Pet{
    public Cat(){
        super("Cat");
    }
}
public class Code07_CatDogQueue {

    private static class WarpPet{
        int seq;
        Pet pet;
        public WarpPet(int seq, Pet pet) {
            this.seq = seq;
            this.pet = pet;
        }
    }
    private Queue<WarpPet> dogQueue;
    private Queue<WarpPet> catQueue;

    private int num ;
    public Code07_CatDogQueue() {
        this.dogQueue = new LinkedList<>();
        this.catQueue = new LinkedList<>();
        this.num = 0;
    }

    public void add(Pet pet){
        if(pet.type.equals("Dog")){
            dogQueue.add(new WarpPet(++num,pet));
        }else if(pet.type.equals("Cat")){
            catQueue.add(new WarpPet(++num,pet));
        }
    }
    //谁早进去的谁先出去
    public Pet poll(){
        if(dogQueue.isEmpty() && catQueue.isEmpty()){
            throw new RuntimeException("empty");
        }
        if(dogQueue.isEmpty()){
            return catQueue.poll().pet;
        }
        if(catQueue.isEmpty()){
            return dogQueue.poll().pet;
        }
        if(dogQueue.peek().seq < catQueue.peek().seq){
            return dogQueue.poll().pet;
        }
        return catQueue.poll().pet;
    }
    public Dog pollDog() {
        return (Dog) dogQueue.poll().pet;
    }
    public Cat pollCat() {
        return (Cat) catQueue.poll().pet;
    }
    public boolean isEmpty() {
        return dogQueue.isEmpty() && catQueue.isEmpty();
    }

    public static void main(String[] args) {
        Code07_CatDogQueue test = new Code07_CatDogQueue();

        Pet dog1 = new Dog();
        Pet cat1 = new Cat();
        Pet dog2 = new Dog();
        Pet cat2 = new Cat();
        Pet dog3 = new Dog();
        Pet cat3 = new Cat();

        test.add(dog1);
        test.add(cat1);
        test.add(dog2);
        test.add(cat2);
        test.add(dog3);
        test.add(cat3);

        test.add(dog1);
        test.add(cat1);
        test.add(dog2);
        test.add(cat2);
        test.add(dog3);
        test.add(cat3);

        test.add(dog1);
        test.add(cat1);
        test.add(dog2);
        test.add(cat2);
        test.add(dog3);
        test.add(cat3);
        while (!test.dogQueue.isEmpty()) {
            System.out.println(test.pollDog().type);
        }
        while (!test.isEmpty()) {
            System.out.println(test.pollCat().type);
        }
    }
}
